package com.xadrez.modelo;

import com.xadrez.Principal;
import java.util.ArrayList;
import java.util.List;

public class Rainha extends Peca {

    public Rainha() {
    }

    public Rainha(Jogador jogador) {
        super(jogador);
    }

    @Override
    public List<Posicao> recuperaMovimentosPossiveis(){
        List<Posicao> lista = new ArrayList<Posicao>();
        lista.addAll(recuperaPosicoesANordeste());
        lista.addAll(recuperaPosicoesANoroeste());
        lista.addAll(recuperaPosicoesASudeste());
        lista.addAll(recuperaPosicoesASudoeste());
        lista.addAll(recuperaPosicoesHorizontais());
        lista.addAll(recuperaPosicoesVerticais());

        if (lista.isEmpty()) {
            lista = null;
        }

        return lista;
    }

    // <editor-fold defaultstate="collapsed" desc="MÉTODOS DE RECUPERAÇÃO">
    private List<Posicao> recuperaPosicoesANordeste() {
        List<Posicao> lista = new ArrayList<Posicao>();
        boolean continua = true;

        int x = this.getPosicaoNoTabuleiro().getX() + 1;
        int y = this.getPosicaoNoTabuleiro().getY() + 1;

        while (continua && x < 8 && y < 8) {
            if (Principal.getTabuleiro().temPecaDoJogadorNaPosicao(x, y)
                    || Principal.getTabuleiro().temAdversarioNaPosicao(x, y)) {
                lista.add(new Posicao(x, y));
                continua = false;
            } else {
                lista.add(new Posicao(x, y));
            }
            x++;
            y++;
        }

        return lista;
    }

    private List<Posicao> recuperaPosicoesANoroeste() {
        List<Posicao> lista = new ArrayList<Posicao>();
        boolean continua = true;

        int x = this.getPosicaoNoTabuleiro().getX() - 1;
        int y = this.getPosicaoNoTabuleiro().getY() + 1;

        while (continua && y < 8 && x >= 0) {
            if (Principal.getTabuleiro().temPecaDoJogadorNaPosicao(x, y)
                    || Principal.getTabuleiro().temAdversarioNaPosicao(x, y)) {
                lista.add(new Posicao(x, y));
                continua = false;
            } else {
                lista.add(new Posicao(x, y));
            }
            x--;
            y++;
        }

        return lista;
    }

    private List<Posicao> recuperaPosicoesASudoeste() {
        List<Posicao> lista = new ArrayList<Posicao>();
        boolean continua = true;

        int x = this.getPosicaoNoTabuleiro().getX() - 1;
        int y = this.getPosicaoNoTabuleiro().getY() - 1;
        
        while (continua && y >= 0 && x >= 0) {
            if (Principal.getTabuleiro().temPecaDoJogadorNaPosicao(x, y)
                    || Principal.getTabuleiro().temAdversarioNaPosicao(x, y)) {
                lista.add(new Posicao(x, y));
                continua = false;
            } else {
                lista.add(new Posicao(x, y));
            }
            x--;
            y--;
        }

        return lista;
    }

    private List<Posicao> recuperaPosicoesASudeste() {
        List<Posicao> lista = new ArrayList<Posicao>();
        boolean continua = true;

        int x = this.getPosicaoNoTabuleiro().getX() + 1;
        int y = this.getPosicaoNoTabuleiro().getY()- 1;
        
        while (continua && y >= 0 && x < 8) {
            if (Principal.getTabuleiro().temPecaDoJogadorNaPosicao(x, y)
                    || Principal.getTabuleiro().temAdversarioNaPosicao(x, y)) {
                lista.add(new Posicao(x, y));
                continua = false;
            } else {
                lista.add(new Posicao(x, y));
            }
            x++;
            y--;
        }

        return lista;
    }

    private List<Posicao> recuperaPosicoesVerticais() {
        //Primeiro recuperamos a posição da casa onde se encontra a peca.
        int posicaoX = this.getPosicaoNoTabuleiro().getX();
        int posicaoY = this.getPosicaoNoTabuleiro().getY();

        List<Posicao> lista = new ArrayList<Posicao>();

        //Vamos procurar abaixo da peca se a posicao (x,y) esta la.
        int x = posicaoX + 1;
        boolean continua = true;
        while (continua && x < 8) {
            if (Principal.getTabuleiro().temPecaDoJogadorNaPosicao(x, posicaoY)
                    || Principal.getTabuleiro().temAdversarioNaPosicao(x, posicaoY)) {
                lista.add(new Posicao(x, posicaoY));
                continua = false;
            } else {
                lista.add(new Posicao(x, posicaoY));
            }
            x++;
        }

        //Vamos procurar acima da peca se a posição (x,y) esta la.
        x = posicaoX - 1;
        continua = true;
        while (continua && x >= 0) {
            if (Principal.getTabuleiro().temPecaDoJogadorNaPosicao(x, posicaoY)
                    || Principal.getTabuleiro().temAdversarioNaPosicao(x, posicaoY)) {
                lista.add(new Posicao(x, posicaoY));
                continua = false;
            } else {
                lista.add(new Posicao(x, posicaoY));
            }
            x--;
        }

        return lista;
    }

    private List<Posicao> recuperaPosicoesHorizontais() {
        //Primeiro recuperamos a posição da casa onde se encontra a peca.
        int posicaoX = this.getPosicaoNoTabuleiro().getX();
        int posicaoY = this.getPosicaoNoTabuleiro().getY();

        List<Posicao> lista = new ArrayList<Posicao>();

        //Vamos procurar a direita da peca se a posicao (x,y) esta la.
        int y = posicaoY + 1;
        boolean continua = true;
        while (continua && y < 8) {
            if (Principal.getTabuleiro().temPecaDoJogadorNaPosicao(posicaoX, y)
                    || Principal.getTabuleiro().temAdversarioNaPosicao(posicaoX, y)) {
                lista.add(new Posicao(posicaoX, y));
                continua = false;
            } else {
                lista.add(new Posicao(posicaoX, y));
            }
            y++;
        }

        //Vamos procurar a esquerda da peca se a posição (x,y) esta la.
        y = posicaoY - 1;
        continua = true;
        while (continua && y >= 0) {
            if (Principal.getTabuleiro().temPecaDoJogadorNaPosicao(posicaoX, y)
                    || Principal.getTabuleiro().temAdversarioNaPosicao(posicaoX, y)) {
                lista.add(new Posicao(posicaoX, y));
                continua = false;
            } else {
                lista.add(new Posicao(posicaoX, y));
            }
            y--;
        }

        return lista;
    }
    // </editor-fold>

    @Override
    public String toString() {
        return "rainha";
    }
}
